package ar.com.profertil.frances.parser;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import ar.com.profertil.frances.analizer.AnalizerAltaClientes;
import ar.com.profertil.frances.entity.AltaClientesFrances;
import ar.com.profertil.frances.entity.Cliente;
import ar.com.profertil.utils.entity.RecibirArchivoEntity;
import ar.com.profertil.utils.parser.ParserIdoc;

// TODO: Auto-generated Javadoc
/**
 * The Class ParserIdocAltaClientesFrances.
 * 
 * @author augusto.ferrari@softtek.com
 * 
 *         Esta clase se encarga de definir los metodos para parsear los datos y
 *         generar las salidas correspondientes.
 */
public class ParserIdocAltaClientesFrances extends ParserIdoc implements Serializable {

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = 2996905317669627868L;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * ar.com.profertil.utils.parser.ParserIdoc#armarIdocArchivoRecibido(java
	 * .lang.String)
	 */
	@Override
	public RecibirArchivoEntity armarIdocArchivoRecibido(String doc) {
		AltaClientesFrances altaClientesFrances = new AltaClientesFrances();
		AnalizerAltaClientes analizer = new AnalizerAltaClientes();

		analizer.inicializar(doc);

		// Lenado datos Clientes.
		String[] clientes = analizer.getClientes();
		altaClientesFrances.inicializarClientes(clientes.length);

		for (int i = 0; i < clientes.length; i++) {
			Cliente cliente = new Cliente();

			cliente.setIdentificadorEmpresa(clientes[i].substring(0, 4));
			cliente.setCodigoMovimiento(clientes[i].substring(4, 5));
			cliente.setNumeroDepositanteIni(clientes[i].substring(5, 23));
			cliente.setNumeroDepositanteFin(clientes[i].substring(23, 41));
			cliente.setNombreDepositante(clientes[i].substring(41, 76));
			cliente.setDomicilio(clientes[i].substring(76, 106));
			cliente.setCodPostal(clientes[i].substring(106, 110));
			cliente.setFechaAlta(clientes[i].substring(110, 118));
			cliente.setFechaBaja(clientes[i].substring(118, 126));
			cliente.setFechaModificacion(clientes[i].substring(126, 134));
			cliente.setFechaVto(clientes[i].substring(134, 142));
			cliente.setTipoDocumentoDepositante(clientes[i].substring(142, 144));
			cliente.setNumeroDocumentoDepositante(clientes[i].substring(144, 157));
			cliente.setCodigoOperacion(clientes[i].substring(157, 158));

			altaClientesFrances.agragarCliente(i, cliente);
		}

		return altaClientesFrances;
	}

	public Collection<Cliente> getClientes(String xml) throws Exception {
		Collection<Cliente> clientes = new ArrayList<Cliente>();
		DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document parse = newDocumentBuilder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
		NodeList list = parse.getElementsByTagName("ZABM_FO");
		for (int i = 0; i < list.getLength(); i++) {
			Element node = (Element)list.item(i);
			Cliente cliente = getCliente(node);
			clientes.add(cliente);
		}

		return clientes;
	}

	private Cliente getCliente(Element node) {
		Cliente cliente = new Cliente();
		cliente.setCodigoOperacion(getValue(node, "ZCOD_OP"));
//			<ZCOD_OP>A</ZCOD_OP>
		cliente.setCodigoMovimiento(getValue(node, "ZCODMOV"));
//			<ZCODMOV>A</ZCODMOV>
		cliente.setCodPostal(getValue(node, "ZCODPOST"));
//			<ZCODPOST>ABCD</ZCODPOST>
		cliente.setDomicilio(getValue(node, "ZDOMICILIO"));
//			<ZDOMICILIO>string35</ZDOMICILIO>
		cliente.setFechaAlta(getValue(node, "ZFALTA"));
//			<ZFALTA>es un fecha</ZFALTA>
		cliente.setFechaBaja(getValue(node, "ZFBAJA"));
//			<ZFBAJA>es un fecha</ZFBAJA>
		cliente.setFechaModificacion(getValue(node, "ZFMODIF"));
//			<ZFMODIF>es un fecha</ZFMODIF>
		cliente.setFechaVto(getValue(node, "ZFVTO"));
//			<ZFVTO>es un fecha</ZFVTO>
		cliente.setIdentificadorEmpresa(getValue(node, "ZIDEMPRESA"));
//			<ZIDEMPRESA>CUIT</ZIDEMPRESA>
		cliente.setNombreDepositante(getValue(node, "ZNOMBRE"));
//			<ZNOMBRE>string35</ZNOMBRE>
		cliente.setNumeroDepositanteFin(getValue(node, "ZDEPOS_FIN"));
//			<ZDEPOS_FIN>string18</ZDEPOS_FIN>
		cliente.setNumeroDepositanteIni(getValue(node, "ZDEPOS_INI"));
//			<ZDEPOS_INI>string18</ZDEPOS_INI>
		cliente.setNumeroDocumentoDepositante(getValue(node, "ZDOCUMENTO"));
//			<ZDOCUMENTO>0123456789012</ZDOCUMENTO>
		cliente.setTipoDocumentoDepositante(getValue(node, "ZTDOC"));
//			<ZTDOC>DU</ZTDOC>
		return cliente;
	}

	private String getValue(Element node, String tagName) {
		String resu = "";
		NodeList nl = node.getElementsByTagName(tagName);
		if(nl != null && nl.getLength()>0){
			resu = nl.item(0).getTextContent();
		}
		return resu;
	}
}
